import fs from "fs";
import path from "path";

// ! 忽略的目录, 注意这个，否则可能会遍历依赖很深
const ignoresContent = `
.git
node_modules
.umi
`;
const ignores = ignoresContent.split("\n").filter((v) => v);

// 空格
const space = (zIndex) => Array.from({ length: zIndex }).fill("").join("|   ");

// 使用Intl.Collator来创建一个比较器，这里我们按中文排序
const collator = new Intl.Collator("zh-Hans-CN", { sensitivity: "accent" });

let result = "";

// 递归函数，用于遍历目录
function traverseDir(dirPath, zIndex = 1) {
  try {
    // 读取目录下的所有文件和文件夹
    const files = fs.readdirSync(dirPath);

    // 过滤出文件夹和文件，并分别排序
    const folders = files
      .filter((file) => fs.statSync(path.join(dirPath, file)).isDirectory())
      .sort((a, b) => a.localeCompare(b, collator));
    const filesList = files
      .filter((file) => fs.statSync(path.join(dirPath, file)).isFile())
      .sort((a, b) => a.localeCompare(b, collator));

    folders.concat(filesList).forEach((file) => {
      const fullPath = path.join(dirPath, file);

      // 检查是文件还是目录
      const stats = fs.statSync(fullPath);

      if (
        stats.isDirectory() &&
        !ignores.some((ignore) => file.includes(ignore))
      ) {
        // 如果是目录，递归调用
        result += `${space(zIndex)}├── ▼ ${file}\n`;
        traverseDir(fullPath, zIndex + 1);
      } else {
        result += `${space(zIndex)}├── ${file}\n`;
      }
    });
    return result;
  } catch (err) {
    console.error(`Error accessing ${dirPath}: ${err}`);
  }
}

// 调用函数，开始遍历当前目录
traverseDir("./");

// 打印结构
console.info(result);
